package org.xx.armory.rpc.routing;

import static org.apache.commons.lang3.StringUtils.trimToEmpty;
import static org.xx.armory.commons.Validators.notNull;

/**
 * 路由标记类型。
 */
enum RouteTokenType {
    /**
     * 路由中的占位符。
     */
    PLACEHOLDER,

    /**
     * 路由中的普通文本。
     */
    TEXT
}

/**
 * 路标标记对象。
 */
abstract class RouteToken {
    private final String name;
    private final RouteTokenType tokenType;

    /**
     * 初始化路由标记对象。
     *
     * @param name
     *         标记的名字。
     * @param tokenType
     *         标记的类型。
     * @throws IllegalArgumentException
     *         如果参数{@code tokenType}是{@code null}。
     */
    RouteToken(
            String name,
            RouteTokenType tokenType
    ) {
        this.name = trimToEmpty(name);
        this.tokenType = notNull(tokenType, "tokenType");
    }

    /**
     * 获取标记的名字。
     *
     * @return 标记的名字。
     */
    public String getName() {
        return name;
    }

    /**
     * 获取标记的类型。
     *
     * @return 标记的类型。
     */
    RouteTokenType getTokenType() {
        return tokenType;
    }

    /**
     * 在指定URL的指定位置尝试匹配。
     *
     * @param url
     *         指定URL。
     * @param pos
     *         指定的位置(从0开始)。
     * @return 如果能匹配则返回匹配的文本，否则返回空字符串。
     */
    abstract String match(
            String url,
            int pos
    );
}
